// cf-261c
// 题意：给定一段代码生成 (m+1) * (m+1) 的0, 1矩阵，问对于任意m<=n(<=10^12),
//       第m+1行等于t的m的个数是多少。
//
// 题解：首先对着题目中的代码打一遍，发现是一个很有规律的分形（代码见
//       261c-tmp.cc），然后就可以找到规律了。首先t只能是2的幂次，
//       其次由于是分形就可以递归处理然后记忆化。
//       当然图形是三角形，也是成倍递增，最后有一点剩余，单独做一个类似的
//       dp就行。
//       判断幂次可以用t & (t-1)。
//
// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

long long const maxn = 1000000000000;
int const maxm = 50;
long long f[maxm][maxm];
std::vector<long long> p2;
long long n, t, kth, left;

void init()
{
	long long p = 1;
	for (; p <= maxn; p *= 2)
		p2.push_back(p);

	for (int i = 0; i < maxm; i++)
		for (int j = 0; j < maxm; j++)
			f[i][j] = -1;
}

int index(int x)
{
	auto it = std::lower_bound(p2.begin(), p2.end(), x);
	if (it == p2.end() || *it != x) return -1;
	return it - p2.begin();
}

long long dp(int x, int t)
{
	if (t < 0) return 0;
	if (f[x][t] != -1) return f[x][t];
	if (t > x) return f[x][t] = 0;
	if (x == 2) return f[x][t] = t == 1 ? 2 : 1;
	long long ret = dp(x - 1, t) + dp(x - 1, t - 1);
	return f[x][t] = ret;
}

long long dp2(long long left, int t)
{
	if (!left) return 0;
	if (left == 1) return t == 0 ? 1 : 0;
	if (left == 2) return t == 0 ? 1 : (t == 1 ? 1 : 0);
	if (left == 3) return t == 0 ? 1 : (t == 1 ? 2 : 0);
	int tmp = std::upper_bound(p2.begin(), p2.end(), left) - p2.begin() - 1;
	if (t > p2[tmp + 1]) return 0;
	long long ret = dp(tmp, t);
	return ret + dp2(left - p2[tmp], t - 1);
}

int main()
{
	init();
	std::cin >> n >> t;
	if (n == 1) {
		std::cout << (t == 1 ? 1 : 0) << '\n';
		return 0;
	} else if (n == 2) {
		std::cout << (t == 1 ? 1 : (t == 2 ? 1 : 0)) << '\n';
		return 0;
	}
	if (index(t) == -1) { std::cout << "0\n"; return 0; }
	n++;
	kth = std::log(n + 1) / std::log(2.0) - 2;
	left = n - ((1ll) << (kth + 2)) + 4 - 3;
	long long ans = 0;

	for (int i = kth + 1; i > 1; i--)
		ans += dp(i, index(t));

	ans += dp2(left, index(t));
	if (t == 1) ans++;
	else if (t == 2) ans++;
	std::cout << ans << '\n';
}

